/******************************************************************************************
 *   Obsługa wyświetlacza LCD (hd44780.h)
 *
 *   Utworzono: 07-12-2010
 *       Autor: czopas
 *****************************************************************************************/

#ifndef HD44780_H_
#define HD44780_H_

/******************************************************************************************
 *	Deklaracje dołączanych plików nagłówkowych i bibliotek					 			 *
 *****************************************************************************************/
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <util/delay.h>

#define NONE_ZERO	0x00
//#define ADD_ZERO	0x01
#define ADD_SPACE	0x02

/******************************************************************************************
 *	Wyświetlacz LCD															 			 *
 *****************************************************************************************/
#define LCD_Y 2						// ilosć wierszy wyswietlacza LCD
#define LCD_X 16					// ilosć kolumn wyswietlacza LCD

#define USE_RW 0					// 0 - R/W podłączony do GND, 1 - R/W podłączony do uC

#define USE_LCD_GO_TO	1			// ustawia kursor na wybranej pozycji Y,X (Y=0-3, X=0-n)

#define USE_LCD_CHAR 	0			// wysyła pojedynczy znak jako argument funkcji

#define USE_LCD_STR_P 	1			// wysyła string umieszczony w pamięci FLASH
#define USE_LCD_STR_E 	0			// wysyła string umieszczony w pamięci EEPROM

#define USE_LCD_INT 	1			// wyswietla liczbę dziesietną na LCD
#define USE_LCD_HEX 	1			// wyswietla liczbę szesnastkową na LCD

#define USE_LCD_DEFCHAR		1		// wysyła zdefiniowany znak z pamięci RAM
#define USE_LCD_DEFCHAR_P 	0		// wysyła zdefiniowany znak z pamięci FLASH
#define USE_LCD_DEFCHAR_E 	0		// wysyła zdefiniowany znak z pamięci EEPROM

#define USE_LCD_CURSOR_ON 		0	// obsługa włączania/wyłączania kursora
#define USE_LCD_CURSOR_BLINK 	0	// obsługa włączania/wyłączania migania kursora
#define USE_LCD_CURSOR_HOME 	0	// ustawia kursor na pozycji początkowej

#if USE_RW == 1
	#define LCD_RW_DIR		DDRC		//
	#define LCD_RW_PORT		PORTC		// definicja RW wyswietlacza
	#define LCD_RW			(1 << PC1)	//
#endif

#define LCD_RS_DIR		DDRC		//
#define LCD_RS_PORT 	PORTC		// definicja RS wyswietlacza
#define LCD_RS			(1 << PC2)	//

#define LCD_E_DIR		DDRC		//
#define LCD_E_PORT		PORTC		// definicja E wyswietlacza
#define LCD_E			(1 << PC3)	//

#define LCD_DB4_DIR		DDRC		//
#define LCD_DB4_PORT	PORTC		// definicja DB4 wyswietlacza
#define LCD_DB4_PIN		PINC		//
#define LCD_DB4			(1 << PC4)	//

#define LCD_DB5_DIR		DDRC		//
#define LCD_DB5_PORT	PORTC		// definicja DB5 wyswietlacza
#define LCD_DB5_PIN		PINC		//
#define LCD_DB5			(1 << PC5)	//

#define LCD_DB6_DIR		DDRC		//
#define LCD_DB6_PORT	PORTC		// definicja DB6 wyswietlacza
#define LCD_DB6_PIN		PINC		//
#define LCD_DB6			(1 << PC6)	//

#define LCD_DB7_DIR		DDRC		//
#define LCD_DB7_PORT	PORTC		// definicja DB7 wyswietlacza
#define LCD_DB7_PIN		PINC		//
#define LCD_DB7			(1 << PC7)	//

/******************************************************************************************
 *	Komendy sterujące wyswietlaczem HD44780									 			 *
 *****************************************************************************************/
#define HD44780_CLEAR					0x01
#define HD44780_HOME					0x02
#define HD44780_ENTRY_MODE				0x04
	#define HD44780_EM_SHIFT_CURSOR		0
	#define HD44780_EM_SHIFT_DISPLAY	1
	#define HD44780_EM_DECREMENT		0
	#define HD44780_EM_INCREMENT		2
#define HD44780_DISPLAY_ONOFF			0x08
	#define HD44780_DISPLAY_OFF			0
	#define HD44780_DISPLAY_ON			4
	#define HD44780_CURSOR_OFF			0
	#define HD44780_CURSOR_ON			2
	#define HD44780_CURSOR_NOBLINK		0
	#define HD44780_CURSOR_BLINK		1
#define HD44780_DISPLAY_CURSOR_SHIFT	0x10
	#define HD44780_SHIFT_CURSOR		0
	#define HD44780_SHIFT_DISPLAY		8
	#define HD44780_SHIFT_LEFT			0
	#define HD44780_SHIFT_RIGHT			4
#define HD44780_FUNCTION_SET			0x20
	#define HD44780_FONT5x7				0
	#define HD44780_FONT5x10			4
	#define HD44780_ONE_LINE			0
	#define HD44780_TWO_LINE			8
	#define HD44780_4_BIT				0
	#define HD44780_8_BIT				10
#define HD44780_CGRAM_SET				0x40
#define HD44780_DDRAM_SET				0x80

/******************************************************************************************
 *	Konfiguracja adresu pierwszej linii wyswietlacza w zależnosci od jego typu 			 *
 *****************************************************************************************/
#if ( (LCD_Y == 4) && (LCD_X == 16) )
	#define LCD_LINE1 0x00		// adres 1 znaku 1 wiersza
	#define LCD_LINE2 0x28		// adres 1 znaku 2 wiersza
	#define LCD_LINE3 0x14  	// adres 1 znaku 3 wiersza
	#define LCD_LINE4 0x54  	// adres 1 znaku 4 wiersza
#else
	#define LCD_LINE1 0x00		// adres 1 znaku 1 wiersza
	#define LCD_LINE2 0x40		// adres 1 znaku 2 wiersza
	#define LCD_LINE3 0x10  	// adres 1 znaku 3 wiersza
	#define LCD_LINE4 0x50  	// adres 1 znaku 4 wiersza
#endif

/******************************************************************************************
 *	Deklaracje funkcji														 			 *
 *****************************************************************************************/
void lcd_write_command(uint8_t command);
void lcd_write_data(uint8_t data);
void lcd_write_text(char * str);
void lcd_write_text_P(const char * str);
void lcd_write_text_E(char * str);
void lcd_write_int(int val, uint8_t zero);
void lcd_write_hex(int val);
void lcd_define_char(uint8_t nr, uint8_t *znak);
void lcd_define_char_P(uint8_t nr, const uint8_t *znak);
void lcd_define_char_E(uint8_t nr, uint8_t *znak);
void lcd_go_to(uint8_t x, uint8_t y);
void lcd_clear(void);
void lcd_home(void);
void lcd_cursor_on(void);
void lcd_cursor_off(void);
void lcd_blink_on(void);
void lcd_blink_off(void);
void lcd_init(void);

#endif /* HD44780_H_ */

/******************************************************************************************
 *	Koniec pliku hd44780.h
 *****************************************************************************************/
